﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using System.Xml;
using Dominio.Logica;
using Dominio.Entidades;
using InterfazPublica;
using Dominio.Commands;
using Dominio.ObserverEntidades;


namespace Interfaz
{
    public partial class MenuPrincipal : Form, IObserverEntidades
    {
        private Login LoginForm;

        private Agencia Agencia;

        public MenuPrincipal(Login login)
        {
            LoginForm = login;
            InitializeComponent();
        }

        public void CargarJuegos()
        {
            tabControlJuegos.Controls.Clear();
            foreach (IJuegos IJuego in Agencia.GetAgencia().ListaEntidades)
            {
                Form Form = IJuego.CargarFormulario();
                Form.TopLevel = false;
                Form.Visible = true;
                Form.FormBorderStyle = FormBorderStyle.None;
                Form.Dock = DockStyle.Fill;
                TabPage TabPage = new TabPage(IJuego.GetNombre());
                TabPage.Controls.Add(Form);
                tabControlJuegos.Controls.Add(TabPage);
                tabControlJuegos.SelectedTab = TabPage;
            }
        }

        private void MenuPrincipal_Load(object sender, EventArgs e)
        {
            CargarJuegos();
            this.Agencia = Agencia.GetAgencia();
            Usuarios UsuarioLogueado = Agencia.UsuarioLogueado;
            toolStripStatusLabel1.Text = (UsuarioLogueado.IdUsuario.ToString() + " / " + UsuarioLogueado.Nombre);
            List<string> ListaFuncionalidadesUsuario = UsuarioLogueado.ListaFuncionalidadesUsuario();
            ControlCollection ListaControles = (ControlCollection)this.Controls;
            foreach (Control Control in ListaControles) 
            {
                if (Control.GetType() == typeof(LinkLabel))
                {
                    if (ListaFuncionalidadesUsuario.Contains(Control.Text))
                    {
                        Control.Enabled = true;
                    }
                    else
                    {
                        Control.Enabled = false;
                    }
                }
                
            }
            Agencia.GetAgencia().AddObserver(this);
        }


        #region ButtonsAgregarGenerar
        private void btnAgregar_Click(object sender, EventArgs e)
        {
            int Index = tabControlJuegos.SelectedIndex;
            IJuegos JuegoActual = Agencia.ListaEntidades.ElementAt(Index);
            Juegos Juego = Agencia.GetAgencia().GetJuegoAsociado(JuegoActual);
            int Valido= JuegoActual.ValidarDatos();

            if (Valido == 0)
            {
                ICommand command = new ApuestaCommand(JuegoActual, Juego);
                Agencia.ManejadorApuestas.AgregarApuesta(command);
                Agencia.CargarNuegoIJuego(JuegoActual);
                CargarJuegos();
                RefrescarListaApuestas();
                JuegoActual.CargarFormulario().Enabled = false;
            }
        }
        
        private void btnGenerar_Click(object sender, EventArgs e)
        {
            ManejadorApuestas ManejadorApuestas = Agencia.ManejadorApuestas;
            List<DatosApuesta> ListaDatosApuesta = null;

            try
            {
                 if (txtBoxMontoIngresado.Text.ToString() == "")
                {
                    MessageBox.Show("Debe agregar un monto");
                }
                else 
                {
                    ListaDatosApuesta = ManejadorApuestas.Ejecutar();
                    RefrescarListaApuestas();
                    ConfirmacionApuesta FormConfirmacion = new ConfirmacionApuesta();
                    int MontoIngresado = Int32.Parse(txtBoxMontoIngresado.Text.ToString());
                    FormConfirmacion.CargarValores(ListaDatosApuesta, MontoIngresado);
                    FormConfirmacion.ShowDialog();
                    Agencia.GetAgencia().ResetListaEntidades();
                    CargarJuegos();
                    txtBoxMontoIngresado.Clear();
                }
            }
            catch (Exception)
            {
                MessageBox.Show("En este momento no se puede realizar las apuestas" , "Atención", MessageBoxButtons.OK);
            }

        }
        #endregion

        #region LinkLabels
        private void linklblUsuarios_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            groupBoxJuegos.Visible = false;
            groupBoxConsultas.Visible = false;
            if (groupBoxUsuarios.Visible)
            {
                groupBoxUsuarios.Visible = false;
            }
            else
            {
                groupBoxUsuarios.Visible = true;
            }
        }

        private void linklblJuegos_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            groupBoxUsuarios.Visible = false;
            groupBoxConsultas.Visible = false;
            if (groupBoxJuegos.Visible)
            {
                groupBoxJuegos.Visible = false;
            }
            else
            {
                groupBoxJuegos.Visible = true;
            }

        }

        private void linklblRecaudaciones_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Recaudaciones rec = new Recaudaciones();
            rec.ShowDialog();
        }

        private void linklblGanancias_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Ganancias gananciasForm = new Ganancias();
            gananciasForm.ShowDialog();
        }

        private void linklblComisiones_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            ComisionesForm comisiones = new ComisionesForm();
            comisiones.ShowDialog();
        }

        private void linklblPagos_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Pagos pagos = new Pagos();
            pagos.ShowDialog();
        }

        private void linklblLogs_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Logs logs = new Logs();
            logs.ShowDialog();

        }

        private void linklblConsultas_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            groupBoxUsuarios.Visible = false;
            groupBoxJuegos.Visible = false;
            if (groupBoxConsultas.Visible)
            {
                groupBoxConsultas.Visible = false;
            }
            else
            {
                groupBoxConsultas.Visible = true;
            }
        }
        #endregion

        #region ButtonsABM
        private void btnAltaUsuarios_Click(object sender, EventArgs e)
        {
            ABMUsuarios abmUsuarios = new ABMUsuarios(1);
            abmUsuarios.ShowDialog();
        }

        private void btnBajaUsuarios_Click(object sender, EventArgs e)
        {
            ABMUsuarios abmUsuarios = new ABMUsuarios(3);
            abmUsuarios.ShowDialog();
        }

        private void btnModificarUsuarios_Click(object sender, EventArgs e)
        {
            ABMUsuarios abmUsuarios = new ABMUsuarios(2);
            abmUsuarios.ShowDialog();
        }

        private void btnAltaJuegos_Click(object sender, EventArgs e)
        {
            ABMEntidadesJuego abmEntidades = new ABMEntidadesJuego(1);
            abmEntidades.ShowDialog();
        }

        private void btnBajaJuegos_Click(object sender, EventArgs e)
        {
            ABMEntidadesJuego abmEntidades = new ABMEntidadesJuego(2);
            abmEntidades.ShowDialog();
        }
        #endregion

        private void cerrarSesionToolStripMenuItem_Click(object sender, EventArgs e)
        {
            UpdateEntidades();
            this.Visible = false;
            LoginForm.Visible = true;
        }

        public void UpdateEntidades() 
        {
            //QuitarTodasApuesta();
            Agencia.GetAgencia().RefrescarEntidades();
            CargarJuegos();
        }

        private void salirToolStripMenuItem_Click(object sender, EventArgs e)
        {
            DialogResult res = MessageBox.Show("Desea salir de la Random SA?", "Atención", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
            if (res.ToString().Equals("OK")) { Application.Exit(); }
        }

        private void RefrescarListaApuestas()
        {
            lstApuestas.DataSource = null;
            lstApuestas.DataSource = Agencia.GetAgencia().ManejadorApuestas.GetListaCommands();
        }

        private void btnQuitar_Click(object sender, EventArgs e)
        {
            QuitarApuesta();
        }

        private void QuitarApuesta()
        {
            DialogResult res = MessageBox.Show("Desea quitar la apuesta de la lista?", "Atención", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
            if (res.ToString().Equals("OK"))
            {
                Object Object = lstApuestas.SelectedItem;
                Agencia.ManejadorApuestas.EliminarApuesta((ICommand)Object);
                RefrescarListaApuestas();
            }
        }

        private void btnQuitarTodas_Click(object sender, EventArgs e)
        {
            QuitarTodasApuesta();
        }

        private void QuitarTodasApuesta()
        {
            DialogResult res = MessageBox.Show("Desea quitar todas las apuestas de la lista?", "Atención", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
            if (res.ToString().Equals("OK"))
            {
                Agencia.ManejadorApuestas.GetListaCommands().Clear();
                RefrescarListaApuestas();
            }
        }

        private void btnAgregarConsulta_Click(object sender, EventArgs e)
        {
            CargarConsultas Consultas = new CargarConsultas();
            Consultas.ShowDialog();
        }


        private void btnEjecutar_Click(object sender, EventArgs e)
        {
            EjecutarConsultas Consultas = new EjecutarConsultas();
            Consultas.ShowDialog();
        }

        private void linklblRoles_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            ABMRoles ABMRoles = new ABMRoles();
            ABMRoles.ShowDialog();
        }

        private void btnRolesUsuarios_Click(object sender, EventArgs e)
        {
            RolesUsuarios RolesUsuarios = new RolesUsuarios();
            RolesUsuarios.ShowDialog();
        }

 
        private void MontoIngresadoSoloNumeros(object sender, KeyPressEventArgs e)
        {
            e.Handled = EsDigit(e, txtBoxMontoIngresado.Text);  
        }


        private static bool EsDigit(KeyPressEventArgs e, string texto)  
        {
            bool IsDec = false;
            int nroDec = 0;

            try
            {
                if (e.KeyChar == 8) { return false; }

                for (int i = 0; i < texto.Length; i++)
                {
                    if (texto[i] == '.') { IsDec = true; }
                    if (IsDec && nroDec++ >= 2) { return true; }
                }

                if (e.KeyChar >= 48 && e.KeyChar <= 57)
                {
                    return false;
                }
                else if (e.KeyChar == 46)
                {
                    if (IsDec) { return true; }
                    else { return false; }
                }
                else { return true; }
            }
            catch (Exception)
            {
                throw;
            }
        } 

    }
}
